﻿using System.Collections.Generic;
using NHibernate;
using NHibernate.Criterion;
using Neturion.Dados;
using Neturion.IRepositorios;

namespace Neturion.Repositorios
{
    public class RepositorioEmpresa : IRepositorioEmpresa
    {
        public Empresa Inserir(Empresa empresa)
        {
            GerenciadorBDConfigs.Instance.SessaoAtual().Save(empresa);
            return empresa;
        }

        public Empresa Atualizar(Empresa empresa)
        {
            Empresa tmpEmpresa = ObterPorId(empresa.EmpresaId);
            // Atribuicao dos valores do objeto da memoria para o objeto obtido no banco de dados
            tmpEmpresa.Codigo = empresa.Codigo;
            
            tmpEmpresa.ListaSistemas.Clear();
            foreach (Sistema sistema in empresa.ListaSistemas)
            {
                tmpEmpresa.AdicionarSistema(sistema);
            }

            GerenciadorBDConfigs.Instance.SessaoAtual().Merge(tmpEmpresa);
            return tmpEmpresa;
        }

        public void Excluir(Empresa empresa)
        {
            GerenciadorBDConfigs.Instance.SessaoAtual().Delete(empresa);
        }

        public IList<Empresa> ObterTodos()
        {
            ICriteria criteria = GerenciadorBDConfigs.Instance.SessaoAtual().CreateCriteria(typeof(Empresa));
            return criteria.List<Empresa>() as List<Empresa>;
        }

        public Empresa ObterPorId(int id)
        {
            return GerenciadorBDConfigs.Instance.SessaoAtual().Get<Empresa>(id);
        }

        public Empresa ObterPorCodigo(string codigo)
        {
            ICriteria criteria = GerenciadorBDConfigs.Instance.SessaoAtual().CreateCriteria(typeof(Empresa))
                .Add(Restrictions.Eq("Codigo",codigo));
            return criteria.UniqueResult<Empresa>();
        }
    }
}